/**
 ******************************************************************************
 * @file           : bsp_spi.h
 * @brief          : SPI Driver Header File (STM32F1xx)
 ******************************************************************************
 * @attention
 *
 * SPI驱动程序头文件
 * 提供SPI主机模式通信接口
 * 支持阻塞式收发和DMA传输
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_SPI_H
#define __BSP_SPI_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Exported types ------------------------------------------------------------*/
/**
 * @brief SPI错误码枚举
 */
typedef enum
{
    SPI_OK = 0,                 /*!< 成功 */
    SPI_ERROR_PARAM,            /*!< 参数错误 */
    SPI_ERROR_TIMEOUT,          /*!< 超时错误 */
    SPI_ERROR_BUSY,             /*!< 总线忙 */
    SPI_ERROR_HAL               /*!< HAL库错误 */
} SPI_Error_e;

/**
 * @brief SPI状态枚举
 */
typedef enum
{
    SPI_STATE_IDLE = 0,         /*!< 空闲状态 */
    SPI_STATE_BUSY,             /*!< 忙状态 */
    SPI_STATE_TX,               /*!< 发送状态 */
    SPI_STATE_RX,               /*!< 接收状态 */
    SPI_STATE_TX_RX,            /*!< 收发状态 */
    SPI_STATE_ERROR             /*!< 错误状态 */
} SPI_State_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void spi_init(void);                                                            /* SPI初始化 */
void spi_deinit(void);                                                          /* SPI反初始化 */

/* 片选控制函数 */
void spi_cs_select(void);                                                       /* 选中从机（拉低CS） */
void spi_cs_deselect(void);                                                     /* 取消选中（拉高CS） */

/* 基础读写函数 */
uint8_t spi_read_write_byte(uint8_t tx_data);                                   /* 读写单字节 */

/* 高级读写函数 */
SPI_Error_e spi_write(const uint8_t *data, uint16_t len);                       /* 写多字节 */
SPI_Error_e spi_read(uint8_t *data, uint16_t len);                              /* 读多字节 */
SPI_Error_e spi_write_read(const uint8_t *tx_data, uint8_t *rx_data, uint16_t len);  /* 全双工收发 */

/* 状态查询函数 */
SPI_State_e spi_get_state(void);                                                /* 获取SPI状态 */
uint8_t spi_is_busy(void);                                                      /* 检查是否忙 */

/* 调试接口 */
void spi_print_status(void);                                                    /* 打印SPI状态 */

/* DMA中断处理函数（供stm32f1xx_it.c调用） */
#if (SPI_USE_DMA == 1)
void SPI_DMA_IRQHandler(void);                                                  /* DMA中断处理 */
#endif

#ifdef __cplusplus
}
#endif

#endif /* __BSP_SPI_H */
